package hao.itheima.mapper;

import hao.itheima.entity.Dept;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper // 程序启动时候, 自动生成该接口的代理对象, 交给IOC容器管理
public interface DeptMapper {

    /*//数据封装方式一: 手动结果映射
    @Results({
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    */
    //数据封装方式二: 起别名  注意: 别名要跟实体类的属性名称一致
    //@Select("select id, name, create_time createTime, update_time updateTime from dept")
    //错误: 字段名称要写对

    //数据封装方式三: 全局配置, 开启驼峰命名规则映射(前提: 是编写实体类的时候, 属性名要驼峰命名)

    @Select("select id, name, create_time, update_time from dept")
    public List<Dept> list();

    /**
     * 根据id删除部门
     * @param id
     */
    //如果只有一个参数的时候,占位后里面的参数名可以乱写, 但是不推荐, 多个参数就必须严格对上
    @Delete("delete from dept where id=#{id}")
    void delete(Integer id);
    //Integer delete(Integer id);

    /**
     * 新增部门
     * @param dept
     */
    //                                                                  注意占位符里面写的属性名必须与dep对象里面的属性名一致
    @Insert("insert into dept(name, create_time, update_time) values(#{name}, #{createTime}, #{updateTime})")
    void save(Dept dept);

    /**
     * 根据id查询部门数据(这里是数据访问层, 注释写他怎么访问数据)
     * 方法名称一般使用语句的关键字
     * @param id
     * @return
     */
    @Select("select id, name, create_time, update_time from dept where id=#{id}")
    Dept selectById(Integer id);

    /**
     * 更新数据
     * @param dept
     */
    //这两种方法都不好, 如果某个字段没有数据, 会将字段置空, 影响数据, 所以不建议使用, 需要使用动态SQL语句, 必须使用XML开发
    //@Update("update dept set name=#{name}, create_time=#{createTime}, update_time=#{updateTime} where id=#{id}")
    //@Update("update dept set name=#{name} where id=#{id}")
    void update(Dept dept);


    //ctrl + shift + - : 快速将代码时收起来
}
